/****************************************************
  @Title: 数据结构实验
  @Name: <实验3-4> 循环队列
  @Object:
      [实验目的] 实现循环队列的基本操作，并进行测试。
      
      [实验提示]
        1. 在文件 sqqueue.h 中完成 SqQueue 的类型定义
     
        2. 实现 SqQueue 的基本操作
           注意：取队头元素、入队列和出队列的前提

  @Files:
      dsp0304.cpp [*]
         测试循环队列的主程序 
      sqqueue.h [*]
         循环队列的实现 
  @Usage:
      请查看"TO-DO列表",根据要求完成代码
  @Copyright: BTC 2004, Zhuang Bo
  @Author: Zhuang Bo
  @Date: 2004
  @Description:
*****************************************************/

#include <stdio.h>
#include <stdlib.h>
#include "sqqueue.h"

//初始化系统 
void Initialize(SqQueue &q); 
//显示操作菜单
void ShowMenu();
//读取用户命令
int GetCommand();  
//执行用户命令 
int DoCommand(int cmd, SqQueue &q);  
//结束执行
void Finalize(SqQueue &q);   

////////////////////////////////////////////
//主程序 
int main()
{
    SqQueue q; //循环队列 
    int cmd; //用户命令 
    
    //系统初始化
    Initialize(q);
    //显示操作菜单 
    ShowMenu();
    //进入主循环    
    while(1) {
        //读取用户命令(0 表示退出) 
        cmd = GetCommand();
        //执行命令cmd操作队列q
        DoCommand(cmd,q);
        //退出命令 
        if( cmd == 0 ) break;  // 退出
    }
    /* NOTE: 以上主循环还可以简化成 
     * while(DoCommand(GetCommand(),q));
     */
    
    //结束前执行的操作 
    Finalize(q);
    
    system("pause"); //暂停 
}

////////////////////////////////////////////
//函数的定义 

//初始化系统 
void Initialize(SqQueue &q)
{
    InitQueue(q); //初始化队列 
}

//显示操作菜单
void ShowMenu()
{
    printf("1)EnQueue 2)DeQueue 3)Clear 4)Empty"
           " 5)Length 6)Head 7)View 9)Menu 0)Quit\n");
}

//读取用户命令
int GetCommand()
{
    int cmd=-1;
    printf(">");
    if(scanf("%d", &cmd)<1)
        fflush(stdin); //处理输入错误 
    return cmd;
}
  
//结束执行
void Finalize(SqQueue &q)
{
    DestroyQueue(q); //销毁队列 
    printf("程序已经结束\n"); 
}  

//执行用户命令cmd, 测试队列的各种操作 
//    执行结束后返回命令(便于书写主循环)
int DoCommand(int cmd, SqQueue &q)
{
    int e;
    
    switch(cmd) {
    case 1: //EnQueue......................
        printf("输入入队列的数据:"); 
        if(scanf("%d",&e)<1) {
            printf("输入错误\n"); 
            fflush(stdin);
        } else if(EnQueue(q,e)==OK)
            printf("入队列成功\n" );
        else
            printf("入队列失败\n");
        break; 
    case 2: //DeQueue......................
        if( DeQueue(q,e)==OK )
            printf("%d 出队列\n", e);
        else
            printf("出队列失败\n"); 
        break;
    case 3: //Clear........................
        if(ClearQueue(q)==OK)
            printf("队列已清空\n");
        else
            printf("清空队列失败\n");        
        break;
    case 4: //Empty........................
        if(QueueEmpty(q)==TRUE)
            printf("队列空\n" );
        else
            printf("队列不空\n"); 
        break;
    case 5: //Length.......................
        printf("队列长度: %d\n", QueueLength(q)); 
        break;
    case 6: //Head.........................
        if(GetHead(q,e)==OK)
            printf("队头元素: %d\n", e);
        else
            printf("取队头元素失败\n"); 
        break;
    case 7: //View.........................
        /* TODO (#9#): 实现SqQueue类型后使用QueueView()函数 */
        //QueueView(q);
        break;
    case 9: //Menu.........................
        ShowMenu();
    case 0: //Quit.........................
        //后面 return cmd; 返回0可以结束主循环 
        break;
    default:
       printf("命令错误\n"); 
    }
    
    return cmd; //返回最近执行的命令 
}

